package com.example.springboot.demo;

import org.springframework.remoting.RemoteAccessException;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;

/**
 *  spring-retry重试测试demo
 * <p>  使用注解
 */
@Component
public class SpringRetryTemplateTest2 {

    /**
     * 重试
     * <p> value : 指定哪些异常类型会触发重试 ;
     * <p> maxAttempts: 在放弃之前会尝试的最大次数,包括第一次尝试 ;
     * <p> backoff： delay = 每次重试的初始延迟(ms) , multiplier = 一个倍数，决定每次重试的延迟是如何增长的 .
     * <p>
     */
    @Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 2))
    public boolean call(String param) {
        return RetryTest.retryTask(param);
    }

    /**
     *  recover 机制
     * 达到最大重试次数,或抛出了一个没有指定进行重试的异常
     */
    @Recover
    public boolean recover(Exception e, String param) {
        System.out.println("达到最大重试次数,或抛出了一个没有指定进行重试的异常:" + e);
        System.out.println("param:" + param);
        return false;
    }
}
